/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package client.communication;

import client.controllers.BoggleController;
import client.controllers.GalgjeController;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import org.apache.log4j.Logger;
import data.Gameroom;
import data.Gameroom.Gametype;
import data.Gebruiker;
import data.Score;
import data.SpelScore;
import javax.swing.DefaultListModel;

/**
 *
 * @author 
 */
public class CSAXHandlerClient {
    //attributen
    private Gebruiker gebruiker1;
    private ArrayList<Gebruiker> gebruikersLijst;
    private boolean bool,  gaming,  online,  aangemaakt,  blanco, spelGestart;
    private int scoreId,  maxAantalSpelers,  x,  y,  xOud,  yOud,  score, poort, letterWaarde,maxTijdPerBeurt, aantalInZakje, scrabblescore, scrabblegewonnen, scrabbleverloren, galgjescore, galgjegewonnen, galgjeverloren, bogglescore, bogglegewonnen, boggleverloren, topscorepositie;
    private Date geboortedatum;
    private String bericht,  avatar,  extra,  hobbys,  geslacht,  email,  password,  passwordGameroom,  nickname,  nicknameOprichter,  gameNaam,  afgekeurdWoord,  letter,woord;
    private Gametype gametype;
    private SpelScore spelscore;
    private SpelScore[] spelscores;
    private Gameroom gameroom;
    private ArrayList<Gameroom> gamerooms;
    private ArrayList<String> afgekeurdeWoordenLijst,goedeWoorden;
    private Hashtable<String, Integer> scores;
    private Logger logger = Logger.getLogger(CSAXHandlerClient.class);
    private Hashtable<String,Integer> letterWaardes;
    private ArrayList<String> aangevraagdeLetters;
    private ArrayList<String> winnaars = null;
    private String[][] bogglebord;
    private Score sc;
    private int rij,kolom;

    public CSAXHandlerClient() {
        gebruiker1 = null;
    }

    //chatten
    public void startReplyChat() {
    }

    public void endReplyChat() {
        ClientCommunication.getInstance().plaatsChatBerichtOpScherm(nickname, bericht);
        resetChat();
    }

    public void startReplyPriveChat() {
    }

    public void endReplyPriveChat() {
        ClientCommunication.getInstance().plaatsChatBerichtOpScherm("[Prive]: " + nickname, bericht);
        resetChat();
    }

    //reply van server op de aanvraag welke spelers er on line zijn
    public void startReplyOnlineSpelers() {
        gebruikersLijst = new ArrayList<Gebruiker>();
    }

    public void endReplyOnlineSpelers() {
        ClientCommunication.getInstance().onlineSpelersOpvullen(gebruikersLijst);
        resetGebruikersLijst();
    }

    public void startGebruiker() {
        gebruiker1 = new Gebruiker();
    }

    public void endGebruiker() {
        if (gebruikersLijst != null) {
            maakGebruiker();
            gebruikersLijst.add(gebruiker1);
            resetGebruiker();
        }
    }
    
    // registratie
    
    public void startReplyCheckNicknameBestaatAl(){
        
    }
    
    public void endReplyCheckNicknameBestaatAl(){
        if(ClientCommunication.getInstance().getFrmInlog().getRfrm() !=null)
         ClientCommunication.getInstance().getFrmInlog().getRfrm().registreren(bool);
        else
         ClientCommunication.getInstance().getChatroom().getRfrm().registreren(bool);
    }
    
    public void startReplyZendAvatarAanvraag(){
        
    }
    
    public void endReplyZendAvatarAanvraag(){
        //logger.info("in endreplyzendavataraanvraag");
        ClientCommunication.getInstance().startAvatarSocket(poort);
    }
    
    public void startReplyGeefAvatarAanvraag(){
        
    }
    
    public void endReplyGeefAvatarAanvraag(){
        ClientCommunication.getInstance().startGeefAvatarSocket(poort);
    }
    
    public void startReplyToAllSpelerAanDeBeurt(){
        
    }
    
    public void endReplyToAllSpelerAanDeBeurt(){
        ClientCommunication.getInstance().ReplyToAllSpelerAanDeBeurt(nickname);
        resetNickname();
    }

    /**
     * 
     * ------------- Inloggen ---------------
     * 
     */
    // reply van server dat speler al online is
    public void startReplySpelerAlOnline() {
    }

    public void endReplySpelerAlOnline() {
        ClientCommunication.getInstance().verderInloggen(bool);
    }

    public void startReplySpelerOnline() {
    }

    public void endReplySpelerOnline() {
        ClientCommunication.getInstance().replySpelerOnline(nickname);
        resetNickname();
    }

    public void startReplySpelerOffline() {
    }

    public void endReplySpelerOffline() {
        ClientCommunication.getInstance().replySpelerOffline(nickname);
        resetNickname();
    }

    public void startSpelerBestaatNiet() {
    }

    public void endSpelerBestaatNiet() {
        ClientCommunication.getInstance().bestaatSpeler(null);
    }

    public void startSpelerBestaat() {
        gebruiker1 = new Gebruiker();
    }

    public void endSpelerBestaat() {
        maakGebruiker();
        ClientCommunication.getInstance().bestaatSpeler(gebruiker1);
        resetGebruiker();
    }
    
     public void startReplyGetSpelerByNickname() {
        gebruiker1 = new Gebruiker();
    }

    public void endReplyGetSpelerByNickname() {
        maakGebruiker();
        ClientCommunication.getInstance().getChatroom().ToonGebruikersForm(gebruiker1,sc);
        resetGebruiker();
        resetScore();
    }

    //niet juiste woorden teruggeven
    public void startNietGeldigeWoorden() {
        afgekeurdeWoordenLijst = new ArrayList<String>();
    }

    public void startNietGeldigeWoord() {
        afgekeurdWoord = new String();
    }

    public void endNietGeldigeWoord() {
        afgekeurdeWoordenLijst.add(afgekeurdWoord);
        resetAfgekeurdWoord();
    }

    public void endNietGeldigeWoorden() {
        logger.info("end niet geldige woorden size:"  +afgekeurdeWoordenLijst.size());
        ClientCommunication.getInstance().woordafhandeling(afgekeurdeWoordenLijst);
    }
    
    public void startGoedeWoorden() {
        goedeWoorden = new ArrayList();
    }
    public void endGoedeWoorden() {
        DefaultListModel l = new DefaultListModel();
        for(int i=0; i < goedeWoorden.size(); i++){
            l.addElement((String)goedeWoorden.get(i));
        }
        logger.info("size goede woorden array aan client kant"+goedeWoorden.size());
        ClientCommunication.getInstance().getChatroom().getBogglegame().setLijst(l);
        goedeWoorden = null;
    }

    //gamerooms
    public void startCreateGameroom() {
    }

    public void endCreateGameroom() {
        ClientCommunication.getInstance().gameroomAangemaakt(aangemaakt,gametype);
    }

    public void startReplyGetGamerooms() {
        gamerooms = new ArrayList<Gameroom>();
    }

    public void endReplyGetGamerooms() {
        ClientCommunication.getInstance().vulGameroomsOp(gamerooms);
        gamerooms = null;
    }

    public void startGameroom() {
        //De code moet hier enkel doorlopen worden wanneer de tag
        // 'gameroom' voorkomt binnen de tag 'gamerooms'
        if (gamerooms != null) {
            gameroom = new Gameroom();
            gebruikersLijst = new ArrayList<Gebruiker>();
        }
    }

    public void endGameroom() {
        if (gamerooms != null) {
            maakGameroom();
            gamerooms.add(gameroom);
            resetGameroom();
        }
    }

    public void startGameroomToegevoegd() {
        gameroom = new Gameroom();
        gebruikersLijst = new ArrayList<Gebruiker>();
    }

    public void endGameroomToegevoegd() {
        maakGameroom();
        ClientCommunication.getInstance().gameroomToegevoegd(gameroom);
        resetGameroom();
    }

    public void startReplyChatInGame() {
    }

    public void endReplyChatInGame() {
        ClientCommunication.getInstance().replyChatInGame(nickname, bericht);
        resetChat();
    }

    public void startReplySpelerJoined() {
    }

    public void endReplySpelerJoined() {
        ClientCommunication.getInstance().replySpelerJoined(nickname);
        resetNickname();
    }

    public void startReplyLeaveGame() {
    }

    public void endReplyLeaveGame() {
        ClientCommunication.getInstance().replyLeaveGame(nickname);
        resetNickname();
    }
    
    public void startReplySpelGestart(){   
    }
    
    public void endReplySpelGestart(){
        ClientCommunication.getInstance().replySpelGestart();
    }
    
    public void startWinnaars(){   
        winnaars = new ArrayList<String>();
    }
    
    public void endWinnaars(){    
    }
    
    public void startReplySpelAfgelopen(){
    }
    
    public void endReplySpelAfgelopen(){
        ClientCommunication.getInstance().replySpelAfgelopen();
    }
    
    public void endReplyMaxBeurtVerlopen(){
        ClientCommunication.getInstance().replyMaxBeurtVerlopen(nickname);
        resetNickname();
    }
    
    public void startReplyToonWinnaars(){    
    }
    
    public void endReplyToonWinnaars(){
        ClientCommunication.getInstance().replyToonWinnaars(winnaars);
        winnaars = null;
    }

    public void startReplyUpdateScores() {
        scores = new Hashtable<String, Integer>();
    }

    public void endReplyUpdateScores() {
        ClientCommunication.getInstance().updateScoreLijst(scores);
        scores = null;
    }

    public void startAanvraagLetterWaaarde() {
        letterWaardes = new Hashtable<String, Integer>();
    }

    public void endAanvraagLetterWaaarde() {
        ClientCommunication.getInstance().setLetterWaardes(letterWaardes);
        letterWaardes = null;
    }
    public void startLetterEnWaarde(){
    }
    public void endLetterEnWaarde(){
        letterWaardes.put(letter,letterWaarde);
        letter=null;
        letterWaarde=0;
    }
    
    public void startReplyLetterAanvraag()
    {
         aangevraagdeLetters=  new ArrayList<String>();
    }
    public void endReplyLetterAanvraag()
    {
        //ClientCommunication.getInstance().setAangevraagdeLetters(aangevraagdeLetters);
        ClientCommunication.getInstance().plaatsBlokjesOpPlankje(aangevraagdeLetters);        
        
        aangevraagdeLetters=  null;
    }

    public void startReplyBlokjesResterend(){  
    }
    
    public void endReplyBlokjesResterend(){
        ClientCommunication.getInstance().printAantalBlokjesResterendInZakje(aantalInZakje);
        aantalInZakje = 0;
    }
    
    public void startUserScore() {
    }

    public void endUserScore() {
        if (scores != null) {
            scores.put(nickname, score);
        }
        resetNickname();
        score = 0;
    }

    public void startReplyToAllSpelerInGame() {
    }

    public void endReplyToAllSpelerInGame() {
        ClientCommunication.getInstance().replyToAllSpelerInGame(nickname);
        resetNickname();
    }

    //het verplaatsen van blokjes doorsturen naar de andere spelers
    //zodat zij at real time zien wat de andere speler aan het doen is
    public void startReplyVerplaatsBlokje() {

    }

    public void endReplyVerplaatsBlokje() {
        Point p = new Point(x, y);
        Point oudePositie = new Point(xOud, yOud);
        ClientCommunication.getInstance().replyVerplaatsBlokje(p, oudePositie, letter, blanco);
        resetBlokje();
    }
    
    public void startZendRandomWoord(){
        
    }
    
    public void endZendRandomWoord(){
        logger.info("xml zendrandomwoord ontvangen");
        logger.info("randomwoord doorgeven aan galgjecontroller");
        //ClientCommunication.getInstance().geefRandomWoord(woord);
        GalgjeController.getInstance().setWoord(woord);
    }
    
    public void startReplyBepaalTopscore(){
        spelscores = new SpelScore[10];
    }
    
    public void endReplyBepaalTopscore(){
        ClientCommunication.getInstance().topscoresBepaald(spelscores);
    }
    
    public void startTopscores(){
        spelscore = new SpelScore();
    }
    public void startTopscore()
    {
                sc = new Score();
    }
    public void endTopscore()
    {
        sc.setGalgjeGewonnen(galgjegewonnen);
        sc.setGalgjeScore(galgjescore);
        sc.setGalgjeVerloren(galgjeverloren);
        sc.setScrabbleGewonnen(scrabblegewonnen);
        sc.setScrabbleScore(scrabblescore);
        sc.setScrabbleVerloren(scrabbleverloren);
        sc.setBoggleGewonnen(bogglegewonnen);
        sc.setBoggleScore(bogglescore);
        sc.setBoggleVerloren(boggleverloren);
        
    }
    
    public void endTopscores(){
        Score s = new Score();
        s.setGalgjeGewonnen(galgjegewonnen);
        s.setGalgjeScore(galgjescore);
        s.setGalgjeVerloren(galgjeverloren);
        s.setScrabbleGewonnen(scrabblegewonnen);
        s.setScrabbleScore(scrabblescore);
        s.setScrabbleVerloren(scrabbleverloren);
        s.setBoggleGewonnen(bogglegewonnen);
        s.setBoggleScore(bogglescore);
        s.setBoggleVerloren(boggleverloren);
        spelscore.setScore(s);
        spelscore.setNickname(nickname);
        spelscore.setPositie(topscorepositie);
        spelscores[spelscore.getPositie()-1]=spelscore;
    }
    
    public void startAanvraagBoggleBord(){
        nickname = null;
    }
    
    public void endAanvraagBoggleBord(){
        ClientCommunication.getInstance().stuurBoggleBord(nickname);
    }
    
    public void startReplyStuurBoggleBord(){
        bogglebord = new String[4][4];
    }
    
    public void endReplyStuurBoggleBord(){
        BoggleController.getInstance().setSpelbord(bogglebord);
        bogglebord = null;
        nickname = null;
    }

    //setters
    public void setWoord(String w){
        logger.info(w);
        woord = w;
    }
    
    public void setBericht(String b) {
        bericht = b;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public void setBool(Boolean b) {
        bool = b;
    }

    public void setPaswoord(String paswoord) {
        this.password = paswoord;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setGeslacht(String geslacht) {
        this.geslacht = geslacht;
    }

    public void setHobbys(String hobbys) {
        this.hobbys = hobbys;
    }

    public void setExtra(String extra) {
        this.extra = extra;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    public void setGeboortedatum(String geboortedatum) {
        this.geboortedatum = new Date(Long.parseLong(geboortedatum));
    }

    public void setScoreid(String score) {
        scoreId = Integer.parseInt(score);
    }

    public void setOnline(String isonline) {
        this.online = Boolean.parseBoolean(isonline);
    }

    public void setGaming(String isgaming) {
        this.gaming = Boolean.parseBoolean(isgaming);
    }

    public void setAangemaakt(boolean aangemaakt) {
        this.aangemaakt = aangemaakt;
    }

    public void setGameNaam(String gameNaam) {
        this.gameNaam = gameNaam;
    }

    public void setMaxAantalSpelers(int aantal) {
        this.maxAantalSpelers = aantal;
    }

    public void setSpelType(String type) {
        if (type.equalsIgnoreCase("scrabble")) {
            this.gametype = Gametype.SCRABBLE;

        } else if (type.equalsIgnoreCase("boggle")) {
            this.gametype = Gametype.BOGGLE;
        }
    }

    public void setNicknameOprichter(String nickname) {
        this.nicknameOprichter = nickname;
    }

    public void setNietGeldigeWoord(String afgekeurdWoord) {
        this.afgekeurdWoord = afgekeurdWoord;
    }
    
    public void setGoedWoord(String woord){
        goedeWoorden.add(woord);
    }

    public void setPasswordGameroom(String password) {
        this.passwordGameroom = password;
    }

    public void setX(int x) {
        this.x = x;
    }

    public void setY(int y) {
        this.y = y;
    }

    public void setXOud(int xOud) {
        this.xOud = xOud;
    }

    public void setYOud(int yOud) {
        this.yOud = yOud;
    }

    public void setLetter(String letter) {
        this.letter = letter;
        if(aangevraagdeLetters!=null){
            aangevraagdeLetters.add(letter);
        }
    }

    public void setBlanco(boolean blanco) {
        this.blanco = blanco;
    }

    public void setBeurt(boolean bool) {
        //logger.info("bij clientcom setBeurt");
        ClientCommunication.getInstance().setAanDeBeurt(bool);
    }
    
    public void setPoort(int poort) {
        this.poort = poort;
    }
    public void setLetterWaarde(int waarde){
        letterWaarde=waarde;
    }
    
    public void setMaxTijdPerBeurt(int maxTijdPerBeurt){
        this.maxTijdPerBeurt = maxTijdPerBeurt;
    }


    //reset alle veldjes
    //hierdoor kan er geen inconsistente data optreden
    //vorige waarden van variabelen kunnen niet per ongeluk gebruikt worden
    private void resetChat() {
        nickname = null;
        bericht = null;
    }

    private void resetBlokje() {
        x = 0;
        y = 0;
        xOud = 0;
        yOud = 0;
        blanco = false;
        letter = "";
    }

    private void resetGebruiker() {
        gebruiker1 = null;
        nickname = null;
        password = null;
        avatar = null;
        extra = null;
        hobbys = null;
        geslacht = null;
        email = null;
        gaming = false;
        online = false;
        scoreId = 0;
        geboortedatum = null;
    }

    private void resetGameroom() {
        passwordGameroom = null;
        nickname = null;
        gameNaam = null;
        gameroom = null;
        maxAantalSpelers = 0;
        gametype = null;
        gebruikersLijst = null;
        nicknameOprichter = null;
        maxTijdPerBeurt = 0;
        resetGebruiker();
    }

    private void resetNickname() {
        nickname = null;
    }

    private void resetGebruikersLijst() {
        gebruikersLijst = null;
    }

    private void resetAfgekeurdWoord() {
        afgekeurdWoord = null;
    }
    //vult alle veldjes van gebruiker in
    private void maakGebruiker() {
        gebruiker1.setAvatar(avatar);
        gebruiker1.setEmail(email);
        gebruiker1.setExtra(extra);
        gebruiker1.setGaming(gaming);
        gebruiker1.setGeboortedatum(geboortedatum);
        gebruiker1.setGeslacht(geslacht);
        gebruiker1.setHobbys(hobbys);
        gebruiker1.setNickname(nickname);
        gebruiker1.setOnline(online);
        gebruiker1.setPaswoord(password);
        gebruiker1.setScoreId(scoreId);
    }

    //vult alle veldjes van gameroom in
    private void maakGameroom() {
        gameroom.setGamenaam(gameNaam);
        gameroom.setMaxAantalSpelers(maxAantalSpelers);
        gameroom.setPaswoord(passwordGameroom);
        gameroom.setNicknameOprichter(nicknameOprichter);
        gameroom.setType(gametype);
        gameroom.setSpelGestart(spelGestart);
        gameroom.setTijdPerBeurtInSeconden(maxTijdPerBeurt);
        for (Gebruiker g : gebruikersLijst) {
            gameroom.addSpelers(g);
        }
    }

    public int getScore() {
        return score;
    }

    public void setScore(int score) {
        this.score = score;
    }

    public void setSpelGestart(boolean spelGestart) {
        this.spelGestart = spelGestart;
    }

    public void setWinnaar(String winnaar) {
        if(winnaars!=null){
            winnaars.add(winnaar);
        }
    }

    public void setAantalInZakje(int aantalInZakje) {
        this.aantalInZakje = aantalInZakje;
    }

    public void setGalgjescore(int galgjescore) {
        this.galgjescore = galgjescore;
    }

    public void setGalgjegewonnen(int galgjegewonnen) {
        this.galgjegewonnen = galgjegewonnen;
    }

    public void setGalgjeverloren(int galgjeverloren) {
        this.galgjeverloren = galgjeverloren;
    }

    public void setBogglescore(int bogglescore) {
        this.bogglescore = bogglescore;
    }

    public void setBogglegewonnen(int bogglegewonnen) {
        this.bogglegewonnen = bogglegewonnen;
    }

    public void setBoggleverloren(int boggleverloren) {
        this.boggleverloren = boggleverloren;
    }

    public void setSpelscore(SpelScore spelscore) {
        this.spelscore = spelscore;
    }

    public void setTopscorepositie(int topscorepositie) {
        this.topscorepositie = topscorepositie;
    }

    public void setScrabblescore(int scrabblescore) {
        this.scrabblescore = scrabblescore;
    }

    public void setScrabblegewonnen(int scrabblegewonnen) {
        this.scrabblegewonnen = scrabblegewonnen;
    }

    public void setScrabbleverloren(int scrabbleverloren) {
        this.scrabbleverloren = scrabbleverloren;
    }
    public void setRij(int rij){
        this.rij = rij;
    }
    
    public void setKolom(int kolom){
        this.kolom = kolom;
    }
    
    public void setBoggleLetter(String l){
        bogglebord[rij][kolom] = l;
    }

    private void resetScore() {
       sc=null;
    }
}
